package com.mercury.ec.module.air.service.order;

import com.mercury.ec.framework.common.pojo.PageResult;
import com.mercury.ec.module.air.controller.admin.order.vo.order.*;

import javax.validation.Valid;

/**
 * 机票订单 Service 接口
 *
 * @author hesx
 */
public interface AirOrderService {

    /**
     * 创建机票订单
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createOrder(@Valid AirOrderCreateReqVO createReqVO);

    /**
     * 更新机票订单
     *
     * @param updateReqVO 更新信息
     * @return 是否成功
     */
    Boolean updateOrder(@Valid AirOrderUpdateReqVO updateReqVO);

    /**
     * 超级更新机票订单
     *
     * @param superUpdateReqVO 更新信息
     * @return 是否成功
     */
    Boolean superUpdateOrder(@Valid AirOrderSuperUpdateReqVO superUpdateReqVO);

    /**
     * 删除机票订单
     *
     * @param id 编号
     */
    void deleteOrder(Long id);

    /**
     * 确认机票订单
     *
     * @param confirmReqVO 确认信息
     * @return 是否成功
     */
    Boolean confirmOrder(@Valid AirOrderConfirmReqVO confirmReqVO);

    /**
     * 支付机票订单
     *
     * @param payReqVO 支付信息
     * @return 是否成功
     */
    AirOrderPayRespVO payOrder(@Valid AirOrderPayReqVO payReqVO);

    /**
     * 审核机票订单
     *
     * @param auditReqVO 审核信息
     * @return 是否成功
     */
    Boolean auditOrder(@Valid AirOrderAuditReqVO auditReqVO);

    /**
     * 机票订单出票（半自动出票）
     *
     * @param issueReqVO 订单出票信息
     * @return 是否成功
     */
    Boolean issueOrder(@Valid AirOrderIssueReqVO issueReqVO);

    /**
     * 机票订单拒绝出票
     *
     * @param refuseIssueReqVO 拒绝出票信息
     * @return 是否成功
     */
    Boolean refuseIssueOrder(@Valid AirOrderRefuseIssueReqVO refuseIssueReqVO);

    /**
     * 订单已出票（一键完成）
     *
     * @param issuedReqVO 订单已出票信息
     * @return 是否成功
     */
    Boolean issuedOrder(@Valid AirOrderIssuedReqVO issuedReqVO);

    /**
     * 申请改签机票订单
     *
     * @param applyChangeReqVO 改签信息
     * @return 是否成功
     */
    Long applyChangeOrder(@Valid AirOrderApplyChangeReqVO applyChangeReqVO);


    /**
     * 申请退票机票订单
     *
     * @param applyReturnReqVO 退票信息
     * @return 是否成功
     */
    Long applyReturnOrder(@Valid AirOrderApplyReturnReqVO applyReturnReqVO);

    /**
     * 取消机票订单
     *
     * @param cancelReqVO 取消信息
     * @return 是否成功
     */
    Boolean cancelOrder(@Valid AirOrderCancelReqVO cancelReqVO);

    /**
     * 根据编码取消订单
     *
     * @param cancelUserId 取消用户id
     * @param pnr          编码
     * @return
     */
    Boolean cancelOrderByPnr(Long cancelUserId, String pnr);

    /**
     * 锁定机票订单
     *
     * @param lockReqVO 锁定信息
     * @return 是否成功
     */
    Boolean lockOrder(@Valid AirOrderLockReqVO lockReqVO);

    /**
     * 解锁机票订单
     *
     * @param lockReqVO 解锁信息
     * @return 是否成功
     */
    Boolean unlockOrder(AirOrderLockReqVO lockReqVO);

    /**
     * 获得机票订单
     *
     * @param id 编号
     * @return 机票订单
     */
    AirOrderRespVO getOrder(Long id);

    /**
     * 根据订单号获取机票订单
     *
     * @param no 订单号
     * @return 机票详情
     */
    AirOrderRespVO getOrderByNo(String no);

    /**
     * 根据编码获取机票订单
     *
     * @param pnr 编码
     * @return
     */
    AirOrderRespVO getOrderByPnr(String pnr);

    /**
     * 获得机票订单分页
     *
     * @param pageReqVO 分页查询
     * @return 机票订单分页
     */
    PageResult<AirOrderRespVO> getOrderPage(AirOrderPageReqVO pageReqVO);

}
